package config

import (
	"fmt"

	"github.com/liyaozong/mengo/contracts/common"
)

type ServiceInfo struct {
	Protocol string `mapstructure:"protocol" json:"protocol" yaml:"protocol"` // http https
	Host     string `mapstructure:"host" json:"host" yaml:"host"`             // 服务地址
	Port     int    `mapstructure:"port" json:"port" yaml:"port"`             // 端口值
}

func (s ServiceInfo) HealthCheck() string {
	hc := fmt.Sprintf("%s://%s:%v%s", s.Protocol, s.Host, s.Port, common.ApiPingRoute)
	return hc
}

func (s ServiceInfo) Url() string {
	url := fmt.Sprintf("%s://%s:%v", s.Protocol, s.Host, s.Port)
	return url
}

func (s ServiceInfo) ListenAddr() string {
	url := fmt.Sprintf(":%v", s.Port)
	return url
}

type Database struct {
	Driver       string `mapstructure:"driver" json:"driver" yaml:"driver"`                         // 数据库类型
	Host         string `mapstructure:"host" json:"host" yaml:"host"`                               // 数据库地址
	Port         string `mapstructure:"port" json:"port" yaml:"port"`                               // 端口
	Dbname       string `mapstructure:"dbname" json:"dbname" yaml:"dbname"`                         // 数据库名
	Username     string `mapstructure:"username" json:"username" yaml:"username"`                   // 数据库用户名
	Password     string `mapstructure:"password" json:"password" yaml:"password"`                   // 数据库密码
	Config       string `mapstructure:"config" json:"config" yaml:"config"`                         // 高级配置
	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns"` // 空闲中的最大连接数
	MaxOpenConns int    `mapstructure:"max-open-conns" json:"max-open-conns" yaml:"max-open-conns"` // 打开到数据库的最大连接数
	LogMode      string `mapstructure:"log-mode" json:"log-mode" yaml:"log-mode"`                   // 是否开启Gorm全局日志
	LogZap       bool   `mapstructure:"log-zap" json:"log-zap" yaml:"log-zap"`                      // 是否通过zap写入日志文件
}

func (db *Database) Dsn() string {
	switch db.Driver {
	case "mysql":
		return db.Username + ":" + db.Password + "@tcp(" + db.Host + ":" + db.Port + ")/" + db.Dbname + "?" + db.Config
	case "postgres":
		return "host=" + db.Host + " user=" + db.Username + " password=" + db.Password + " dbname=" + db.Dbname + " port=" + db.Port + " " + db.Config
	case "sqlite":
		return db.Host
	default:
		return ""
	}
}
